﻿// uhf.h : uhf DLL 的主头文件
//

#pragma once
#include "typedef.h"

typedef int (*RFID_CALLBACK_FUNC) (
	int status,    // 状态标记
	int type,      // 返回类型
	u8  *data,     // 返回数据内容
	int datLen     // 返回数据长度
	);

// 读写UHF配置信息回调函数
typedef int (*RFID_RW_CFG_CALLBACK) (
    int rwFlag,   // 读写标志(0--读, 1--写)
    u8 *data,     // 数据buffer
    u16 dataLen   // 数据长度
    );

// USR最大取值32个word
#define MAX_USR_LEN         (64)
// EPC最大取值为32个word
#define MAX_EPC_LEN         (64)
// TID最大取值为6个word
#define MAX_TID_LEN         (12)
#define MAX_FROMDEV_LEN     (20)
/* 盘点返回的数据信息 */
typedef struct _tagInventoryData {
	u8  fromDev[MAX_FROMDEV_LEN];         // 设备信息(对于串口为COMXX, 对于网络为xxx.xxx.xxx.xxx)
    u8  antennaPort;                      // 天线号
    u8  pc[2];                            // 2字节PC值,pc[0]为高位,pc[1]为低位
    u16 epcLen;                           // EPC字节长度
    u8  epc[MAX_EPC_LEN+1];               // EPC信息
    u8  epc_crc[2];                       // ecp的2字节CRC;
                                          // ecp_crc[0]为高位,ecp_crc[1]为低位
    u16 externalDataLen;                  // TID/USR字节长度
    u8  externalData[MAX_USR_LEN+1];      // TID/USR数据信息
    s16 rssi;                             // RSSI
} INVENTORY_DATA, *pINVENTORY_DATA;

/* 读取返回数据信息 */
typedef struct _tagRwData {
	u8  fromDev[MAX_FROMDEV_LEN];         // 设备信息(对于串口为COMXX, 对于网络为xxx.xxx.xxx.xxx)
    u8  antennaPort;                      // 天线号
    u16 epcLen;                           // EPC字节长度
    u8  epc[MAX_EPC_LEN+1];               // EPC信息
    u16 rwDataLen;                        // 读取到的数据长度
    u8  rwData[MAX_USR_LEN];              // 读取到的数据
    s16 rssi;                             // RSSI
} RW_DATA, *pRW_DATA;

/* 网络连接/端口数据 */
typedef struct _tagNetStatusData {
	u8  ipAddr[20];                       // IP地址,形如192.168.1.16
	u32 port;                             // 端口
} NET_STATUS_DATA, *pNET_STATUS_DATA;

/* 设备心跳数据(仅对RM70xx有效) */
typedef struct _tagHeartbeatData {
	u8  fromDev[MAX_FROMDEV_LEN];         // 设备信息(对于串口为COMXX, 对于网络为xxx.xxx.xxx.xxx)
    u32 seq;                              // 设备自身记录的序号,达到最大值时进行回环
} HEARTBEAT_DATA, *pHEARTBEAT_DATA;


// 操作状态,对于Inventory/Read/Write/Kill,数据包不能直接返回,需要从PACKET中解包返回
typedef enum {
	OPTION_TYPE_NORMAL = 0,
	OPTION_TYPE_INVENTORY,
	OPTION_TYPE_READ,
	OPTION_TYPE_WRITE,
	OPTION_TYPE_KILL,
	OPTION_TYPE_LOCK,

	// 报警信息
	OPTION_TYPE_ALARM_REPORT = 100,
	// 设备心跳
	OPTION_TYPE_HEARTBEAT_REPORT,

	// 透传到APP层
	OPTION_TYPE_TRANS_TO_REMOTE = 1000,

	// 网络连接状态(连接对list模式有效)
	OPTION_TYPE_NET_CONNECT = 10000,
	// 网络状态已经被断开
	OPTION_TYPE_NET_DISCONNECT,
} OPTION_TYPES;

typedef enum {
	PSAM_DEV_K100 = 0,
	PSAM_DEV_KT45Q,

	MAX_PSAM_DEV
} PSAM_DEV;

// 模块连接方式(本地串口,本地网络,远端-如蓝牙透传)
typedef enum {
	RF_CONNECT_MODE_LOCAL_UART = 0,
	RF_CONNECT_MODE_LOCAL_NET,
	RF_CONNECT_MODE_REMOTE,

	RF_CONNECT_MODE_MAX
} RF_CONNECT_MODE;


// RF模块
typedef enum {
	RF_MODULE_TYPE_R2000 = 0,
	RF_MODULE_TYPE_RM8011,
	RF_MODULE_TYPE_RM70XX,

	RF_MODULE_TYPE_MAX
} RF_MODULE_TYPE;

// 报警模式
typedef enum {
	ALARM_MODE_SPEC_TAG = 0,				 // 特定标签报名
	ALARM_MODE_ANY_TAG, 				     // 任意标签报警
	ALARM_MODE_NO_TAG, 				         // 无标签报警
} ALARM_MODE;

// 报警状态
#define ALARM_STATUS_OFF                      (0)
#define ALARM_STATUS_ON                       (1)

/* 报警返回数据信息 */
typedef struct _tagAlarmData {
	u8  fromDev[MAX_FROMDEV_LEN];            // 设备信息(对于串口为COMXX, 对于网络为xxx.xxx.xxx.xxx)
    u8  alarmMode;                           // 报警模式
	u8  isTimeOut;                           // 是否是报警超时
    u8  antennaPort;                         // 天线号
    u16 epcLen;                              // EPC字节长度
    u8  epc[MAX_EPC_LEN+1];                  // EPC信息
    u16 externalDataLen;                  	 // TID/USR字节长度
    u8  externalData[MAX_USR_LEN+1];      	 // TID/USR数据信息
    s16 rssi;                                // RSSI
} ALARM_DATA, *pALARM_DATA;

#ifdef __cplusplus
extern "C" {
#endif

#ifdef _WINDOWS
#define STD_EXPORT   __declspec(dllexport)
#else
#define STD_EXPORT
#endif

	/* libaray functions */
	STD_EXPORT int initRFID(RFID_CALLBACK_FUNC pFunc, RFID_RW_CFG_CALLBACK pRWCfgFunc);
	STD_EXPORT int deinitRFID(void);
	STD_EXPORT int setRFModuleType(u8 moduleType);
	STD_EXPORT int setRFConnectMode(u8 flag);
	STD_EXPORT int powerOnRFModule(void);
	STD_EXPORT int powerOffRFModule(void);
	STD_EXPORT int pushRFData(char *rdBuf, int rdLen);
	STD_EXPORT int parseRFData(void);

	STD_EXPORT int openCom(const char* port, long baud);
	STD_EXPORT int closeCom(void);

	STD_EXPORT int connectRemoteNetwork(const char *remoteAddr, const int remotePort);
	STD_EXPORT int listenRemoteNetwork(const int listPort);
	STD_EXPORT int closeNetwork(void);

	/*
	  RF common and don't depend on actual RF moudule(R2000 AND RM8011)
	  RM70xx is virtual RF module
	*/
	STD_EXPORT int setInventoryArea(u8 area, u8 startAddr, u8 wordLen);
    STD_EXPORT int getInventoryArea(u8 *area, u8 *startAddr, u8 *wordLen);
	STD_EXPORT int setInventoryFilterThreshold(u8 threshold, u16 maxRepeatTimes);
	STD_EXPORT int getInventoryFilterThreshold(u8 *threshold, u16 *maxRepeatTimes);
	STD_EXPORT int resetInventoryFilter(void);
	STD_EXPORT int setAlarmParams(u8 mode, u8 alarmTimes, u8 ignoreSec, u8 alarmSec,
		                          u8 matchStart, u8 matchLen, u8 *match);
	STD_EXPORT int getAlarmParams(u8 *mode, u8 *alarmTimes, u8 *ignoreSec, u8 *alarmSec,
		                          u8 *matchStart, u8 *matchLen, u8 *match);
	STD_EXPORT int setAlarmStatus(u8 status);
	STD_EXPORT int getAlarmStatus(u8 *status);

	/* RF common functions */
	STD_EXPORT int getModuleSerialNumber(u8 *snData, int *snLen);
	STD_EXPORT int getModuleSoftVersion(u8 *version, int *versionLen);
	STD_EXPORT int startInventory(u8 mode, u8 maskFlag);
	STD_EXPORT int stopInventory(void);
	STD_EXPORT int getInventoryStatus(void);
	STD_EXPORT int setPowerLevel(u8 antennaPort, u16 powerLevel);
	STD_EXPORT int getPowerLevel(u8 antennaPort, u16 *powerLevel);

	STD_EXPORT int readTag(u8 *accessPassword, u8 memBank, u8 startAddr, u8 wordLen);
	STD_EXPORT int writeTag(u8 *accessPassword, u8 memBank, u8 startAddr, u8 wordLen, u8 *pWriteData);
	STD_EXPORT int lockTag(u8 killPasswordPermissions,
		                   u8 accessPasswordPermissions,
		                   u8 epcMemoryBankPermissions, u8 tidMemoryBankPermissions,
		                   u8 userMemoryBankPermissions, u8 *accessPassword);
	STD_EXPORT int killTag(u8 *accessPassword, u8 *killPassword);

	STD_EXPORT int setRegion(u8 range);
	STD_EXPORT int getRegion(u8 *range);
	STD_EXPORT int setFixFreq(u32 freq);
	STD_EXPORT int getFixFreq(u32 *freq);
	STD_EXPORT int set18K6CSelectCriteria(u8 status, u8 memBank, u8 target,
		                                  u8 action, u8 enableTruncate,
		                                  u8 maskOffset, u8 maskCount, u8 *mask);
	STD_EXPORT int get18K6CSelectCriteria(u8 *status, u8 *memBank, u8 *target,
		                                  u8 *action, u8 *enableTruncate,
		                                  u8 *maskOffset, u8 *maskCount, u8 *mask);
	STD_EXPORT int getAntennaPortNum(u32 *num);

	/* For R2000 module and RM70xx */
    STD_EXPORT int setResponseDataMode(u8 mode);
    STD_EXPORT int getResponseDataMode(u8 *mode);
    STD_EXPORT int getAntennaSWR(u32 *swr);
	STD_EXPORT int setCurrentProfile(u32 profile);
	STD_EXPORT int getCurrentProfile(u32 *profile);
	STD_EXPORT int setAntennaPortState(u8 antennaPort, u8 antennaStatus);
	STD_EXPORT int getAntennaPortState(u8 antennaPort, u8 *antennaStatus);
	STD_EXPORT int setCurrentSingulationAlgorithm(u32 algorithm);
	STD_EXPORT int getCurrentSingulationAlgorithm(u32 *algorithm);
	STD_EXPORT int setSingulationFixedQParameters(u32 qValue, u32 retryCount,
		                                          u32 toggleTarget,
												  u32 repeatUntilNoTags);
	STD_EXPORT int getSingulationFixedQParameters(u32 *qValue, u32 *retryCount,
		                                          u32 *toggleTarget,
		                                          u32 *repeatUntilNoTags);
	STD_EXPORT int setSingulationDynamicQParameters(u32 startQValue, u32 minQValue,
		                                            u32 maxQValue,
		                                            u32 thresholdMultiplier,
		                                            u32 retryCount,
		                                            u32 toggleTarget);
	STD_EXPORT int getSingulationDynamicQParameters(u32 *startQValue,
		                                            u32 *minQValue,
		                                            u32 *maxQValue,
		                                            u32 *thresholdMultiplier,
		                                            u32 *retryCount, u32 *toggleTarget);
	STD_EXPORT int set18K6CQueryTagGroup(u8 selected, u8 session, u8 target);
	STD_EXPORT int get18K6CQueryTagGroup(u8 *selected, u8 *session, u8 *target);
	STD_EXPORT int setPostSingulationMatchCriteria(u8 status, u8 maskOffset,
		                                           u8 maskCount, u8 *mask);
	STD_EXPORT int getPostSingulationMatchCriteria(u8 *status, u8 *maskOffset,
		                                           u8 *maskCount, u8 *mask);

	/* For multiple Channel module and RM70xx */
	STD_EXPORT int setAntennaPort(u8 antennaPort, u8 antennaStatus, u32 powerLevel,
		                          u32 dwellTime, u32 numberInventoryCycles);
	STD_EXPORT int getAntennaPort(u8 antennaPort, u8 *antennaStatus, u32 *powerLevel,
		                          u32 *dwellTime, u32 *numberInventoryCycles);

	/* For RM8011 module and RM70xx*/
	STD_EXPORT int setWorkMode(u8 mode);
	STD_EXPORT int setQuery(u8 DR, u8 M, u8 TRext, u8 Sel, u8 Session, u8 Target,
		                    u8 Q);
	STD_EXPORT int getQuery(u8 *DR, u8 *M, u8 *TRext, u8 *Sel, u8 *Session, u8 *Target,
		                    u8 *Q);

	/* Only For RM70xx */
	STD_EXPORT int boardFirmwareUpdate(u16 curIdx, u16 maxIdx, u16 dataLen, u8 *data);
	STD_EXPORT int boardReboot(void);
	STD_EXPORT int getBoardSerialNumber(u8 *snData, int *snLen);
	STD_EXPORT int getBoardSoftVersion(u8 *version, int *versionLen);
	STD_EXPORT int setBoardModuleType(u8 moduleType);
	STD_EXPORT int getBoardModuleType(u8 *moduleType);
	STD_EXPORT int setInventoryParams(u8 mode, u8 triggerDInPort, u8 triggerLevel);
	STD_EXPORT int getInventoryParams(u8 *mode, u8 *triggerDInPort, u8 *triggerLevel);
	STD_EXPORT int setHeartBeat(u8 status, u16 interval);
	STD_EXPORT int getHeartBeat(u8 *status, u16 *interval);
	STD_EXPORT int setNetInfo(u8 *ip, u8 *gateWay, u8 *netmask, u8 *macAddr,
		                      u8 *remoteIp, u16 remotePort);
	STD_EXPORT int getNetInfo(u8 *ip, u8 *gateWay, u8 *netmask, u8 *macAddr,
		                      u8 *remoteIp, u16 *remotePort);
	STD_EXPORT int setDOutStatus(u8 port, u8 status);
	STD_EXPORT int getDOutStatus(u8 port, u8 *status);
	STD_EXPORT int getDInStatus(u8 port, u8 *status);
	STD_EXPORT int setAlarmDout(u8 port, u8 status);
	STD_EXPORT int getAlarmDout(u8 *port, u8 *status);
	STD_EXPORT int setInputTriggerAlarm(u8 status, u8 triggerDInPort, u8 triggerLevel,
							            u8 DPort, u8 DOutLevel, u32 alarmMs);
	STD_EXPORT int getInputTriggerAlarm(u8 *status, u8 *triggerDInPort, u8 *triggerLevel,
							            u8 *DPort, u8 *DOutLevel, u32 *alarmMs);

	STD_EXPORT int init70xxSrv(RFID_CALLBACK_FUNC pFunc,
		                       RFID_RW_CFG_CALLBACK pRWCfgFunc);
	STD_EXPORT void pushRM70xxSrvData(char *rdBuf, int rdLen);
	STD_EXPORT int parseRM70xxSrvData(void *pRM70xxFrame, int *rVal);

	/* PSAM common Interface */
	STD_EXPORT int selectPSAMDev(int psamDev);
	STD_EXPORT int initPSAMDev(const char* port, long baud, u8 *ATR, int *ATRLen);
    STD_EXPORT int deinitPSAMDev(void);
	STD_EXPORT u32 APDUInterface(u8 CLA, u8 INS, u8 P1, u8 P2, u8 LC, u8 *LE,
                                 u8 *pInData, u8 *pOutData);

	/* PSAM moudule Interface */
	STD_EXPORT int macReadSM7Register(u16 regAddr, u32 *value);
	STD_EXPORT int macWriteSM7Register(u16 regAddr, u32 value);
	STD_EXPORT int macGetSM7Packet(u32 hstCmd, u16 wantPacketType, void *pData,
								   u16 *dataLen);

	STD_EXPORT int authenticationSM7(u8 *token2);
	STD_EXPORT int readSM7Tag(u8 memBank, u8 startAddr, u8 wordLen);
	STD_EXPORT int writeSM7Tag(u8 memBank, u8 startAddr, u8 wordLen, u8 *pWriteData);


#ifdef __cplusplus
}
#endif

